home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1996 July / C-C++ Users Group Library July 1996.iso / listings / v_12_06 / plauger / streambu.h < prev   
C/C++ Source or Header  |  1994-04-04  |  4KB  |  132 lines

  1. ---------------- Listing 1: The header <streambuf> --------------
  2.  
  3. // streambuf standard header
  4. #ifndef _STREAMBUF_
  5. #define _STREAMBUF_
  6. #include <ios>
  7.         // macros
  8. #define EOF    (-1)
  9.         // type streamoff
  10. typedef long streamoff;
  11. const streamoff _BADOFF = -1;
  12.         // class streampos
  13. class streampos {
  14. public:
  15.     streampos(streamoff = 0, const _Fpost * = 0);
  16.     streamoff offset() const;
  17.     streamoff operator-(const streampos&) const;
  18.     streampos& operator+=(streamoff _O)
  19.         {_Pos += _O; return (*this); }
  20.     streampos& operator-=(streamoff _O)
  21.         {_Pos -= _O; return (*this); }
  22.     streampos operator+(streamoff _O) const
  23.         {return (streampos(*this) += _O); }
  24.     streampos operator-(streamoff _O) const
  25.         {return (streampos(*this) -= _O); }
  26.     _Bool operator==(const streampos&) const;
  27.     _Bool operator!=(const streampos& _R) const
  28.         {return (!(*this == _R)); }
  29.     _Fpost *_Fpos()
  30.         {return (&_Fp); }
  31. private:
  32.     streamoff _Pos;
  33.     _Fpost _Fp;
  34.     };
  35.         // class streambuf
  36. class streambuf {
  37. public:
  38.     virtual ~streambuf();
  39.     streampos pubseekoff(streamoff _O, ios::seekdir _W,
  40.         ios::openmode _M = ios::in | ios::out)
  41.         {return (seekoff(_O, _W, _M)); }
  42.     streampos pubseekpos(streampos _P,
  43.         ios::openmode _M = ios::in | ios::out)
  44.         {return (seekpos(_P, _M)); }
  45.     streambuf *pubsetbuf(char *_S, int _N)
  46.         {return (setbuf(_S, _N)); }
  47.     int pubsync()
  48.         {return (sync()); }
  49.     int sbumpc()
  50.         {return (gptr() != 0 && gptr() < egptr()
  51.             ? *_Gn()++ : uflow()); }
  52.     int sgetc()
  53.         {return (gptr() != 0 && gptr() < egptr()
  54.             ? *_Gn() : underflow()); }
  55.     int sgetn(char *_S, int _N)
  56.         {return (xsgetn(_S, _N)); }
  57.     int snextc()
  58.         {return (sbumpc() == EOF ? EOF : sgetc()); }
  59.     int sputbackc(char _C)
  60.         {return (gptr() != 0 && eback() < gptr()
  61.             && _C == gptr()[-1]
  62.             ? *--_Gn() : pbackfail((unsigned char)_C)); }
  63.     int sungetc()
  64.         {return (gptr() != 0 && eback() < gptr()
  65.             ? *--_Gn() : pbackfail()); }
  66.     int sputc(int _C)
  67.         {return (pptr() != 0 && pptr() < epptr()
  68.             ? (*_Pn()++ = _C) : overflow(_C)); }
  69.     int sputn(const char *_S, int _N)
  70.         {return (xsputn(_S, _N)); }
  71. #if _HAS_ENUM_OVERLOADING
  72.     streampos pubseekoff(streamoff _O, ios::seek_dir _W,
  73.         ios::open_mode _M = ios::in | ios::out)
  74.         {return (pubseekoff(_O, (seekdir)_W, (openmode)_M)); }
  75.     streampos pubseekpos(streampos _P,
  76.         ios::open_mode _M = ios::in | ios::out)
  77.         {return (seekpos(_P, (openmode)_M)); }
  78. #endif
  79. protected:
  80.     streambuf()
  81.         {_Init(); }
  82.     streambuf(_Uninitialized)
  83.         {}
  84.     char *eback() const
  85.         {return (*_IGbeg); }
  86.     char *gptr() const
  87.         {return (*_IGnext); }
  88.     char *egptr() const
  89.         {return (*_IGend); }
  90.     void gbump(int _N)
  91.         {*_IGnext += _N; }
  92.     void setg(char *_B, char *_N, char *_E)
  93.         {*_IGbeg = _B, *_IGnext = _N, *_IGend = _E; }
  94.     char *pbase() const
  95.         {return (*_IPbeg); }
  96.     char *pptr() const
  97.         {return (*_IPnext); }
  98.     char *epptr() const
  99.         {return (*_IPend); }
  100.     void pbump(int _N)
  101.         {*_IPnext += _N; }
  102.     void setp(char *_B, char *_E)
  103.         {*_IPbeg = _B, *_IPnext = _B, *_IPend = _E; }
  104.     unsigned char *&_Gn()
  105.         {return ((unsigned char *&)*_IGnext); }
  106.     unsigned char *&_Pn()
  107.         {return ((unsigned char *&)*_IPnext); }
  108.     virtual int overflow(int = EOF);
  109.     virtual int pbackfail(int = EOF);
  110.     virtual int underflow();
  111.     virtual int uflow();
  112.     virtual int xsgetn(char *, int);
  113.     virtual int xsputn(const char *, int);
  114.     virtual streampos seekoff(streamoff, ios::seekdir,
  115.         ios::openmode = ios::in | ios::out);
  116.     virtual streampos seekpos(streampos,
  117.         ios::openmode = ios::in | ios::out);
  118.     virtual streambuf *setbuf(char *, int);
  119.     virtual int sync();
  120.     void _Init();
  121.     void _Init(char **, char **, char **, char **, char **,
  122.         char **);
  123. private:
  124.     char *_Gbeg, *_Gnext, *_Gend;
  125.     char *_Pbeg, *_Pnext, *_Pend;
  126.     char **_IGbeg, **_IGnext, **_IGend;
  127.     char **_IPbeg, **_IPnext, **_IPend;
  128.     };
  129. #endif
  130.  
  131.  
  132.